//模版字符串。类似于js中es6的模版字符串
//1、可以将多个字符串进行组装
type name='zh'
type age=1;
type sayName=`hellow, ${name} ${age}`//就是es6的模版字符串，产生的结果是一个字符串类型
//2、模版字符串也具备分发能力
//2.1：基础用法
type Direction='left' | 'top' | 'right' | 'bottom'
type marginAll=`margin-${Direction}`// "margin-left" | "margin-top" | "margin-right" | "margin-bottom"
type paddingAll=`padding-${Direction}`// "padding-left" | "padding-top" | "padding-right" | "padding-bottom"
//2.2：多维组合
type IR='1.0' | '2.0' | '3.0'
type IL=20 | 30 | 40
type IRL=`${IR}-${IL}`
//2.2：放到字符串的东西需要约束，必须转化为字符串。不能传对象啥的
type SayHellow1<T extends string | number | bigint | boolean | null | undefined >=`hellow:${T}` //建议这种写法
type SayHellow2<T>=`hellow:${T & string}`//不建议这种写法
type R11=SayHellow1<'zh'>//都是传的字面量
type R12=SayHellow1<20>//都是传的字面量
type R13=SayHellow1<number>//传的基础类型
let r13:R13='hellow:2'//所有基础类型的模版字符串，都是字面量类型的父类型（类型相同）
//2.4：将对象的属性进行重命名：{name,age,address}=>{r_name,r_age,r_address}
type Person={
    name:string
    age:number
    address:string
}
type RePerson<T>={
[K in keyof T as `r_${K & string}`]:T[K] //as `r_${K & string}`，是转化的关键
}
type x=RePerson<Person>

//2.5：将对象K转化为大写
type RePerson1<T>={
    [K in keyof T as `r_${Uppercase<K & string>}`]:T[K] //as `r_${K & string}`，是转化的关键
    }
type x1=RePerson1<Person>
//字符串可以支持的工具函数：Uppercase、Lowercase、Capitalize、Uncapitalize
//得到的结果
// type x1 = {
//     r_NAME: string;
//     r_AGE: string;
//     r_ADDRESS: string;
// }

//2.6：根据对象，设置获取属性的对象类型
let person:Person={
name:'zh',
age:30,
address:'cq'
}
type WidthGetterPerson<P>={
    [K in keyof P as `get${Capitalize<K & string>}`]:()=>P[K]
}
let personGetter:WidthGetterPerson<Person>={
    getName(){
        return person.name
    },
    getAge(){
        return person.age
    },
    getAddress(){
        return person.address
    }
}
//2.7、根据匹配模式来获取类型
//infer 可以进行位置推断
//可以推断 数组｜元组｜string
//可以进行infer来进行位置推断，符合及和推断（中间可以配置分割符）
type GetNameFirstChar<T>=T extends `${infer F} ${infer X}` ? F : never;//获取第一个空格前的内容
type ff=GetNameFirstChar<'ff kk'>
type GetNameFirstChar1<T>=T extends `${infer F}a${infer X}` ? F : never;//获取第一个字母a前的内容
type ff1=GetNameFirstChar1<'ffakk'>
export {}